/**
 * данная программа представляет собой уникальный код который работает, вообще
 * это большая смесь идей разного направления, котороые зарадились по пути написания программы
 * в результате чего получилось это чудо.
 * работает вполне стабильно за исключением ORA-00933: SQL command not properly ended
 * при stmt.executeQuery( "select OBJECT_ID from PARAMS " +
 "where VALUE = '" + object + "'"); в классе class workWithDB в addParam()
 почему выяснить не удалось ошика ужодит на 30 иэлементе и больше не возникает.
 как работает сам не знаю
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.poi.ss.usermodel.Sheet;
import util.*;

/*
 * здесь используются различные классы ImportXML_*
 * в них методы типа ArrayList<String>
 * заполняются из xls файла и после в цикле в классе workWithDB Добавляются в базу данных
 * по средствам loudTODB
 * 
 */


/**
 *
 * @author Altair
 */
public class EmlDBlouder {


    /**
     * @param args the command line arguments
     *             Основная задача правильно все расположить и заставить нормально работать!!!
     *             да наверное это будет самым сложным((
     *
     */
    /**
     *
     * @param args
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static void main(String[] args)
            throws IOException, ClassNotFoundException, SQLException {

     
        ArrayList<String> atr = new ArrayList<String>();

        /**
         * сменить путь к файлу   Import.xls если нужно
         */
        File f = new File("e:\\java\\Import.xls");


        conectionDB con_out = new conectionDB();
        Connection con = con_out.conect();
        trunc_DB trunc_db = new trunc_DB();
            trunc_db.trunc_ATTR_OBJECT_TYPES(con);
            trunc_db.trunc_ATTRIBUTES(con);
            trunc_db.trunc_OBJECT_TYPES(con);
            trunc_db.trunc_OBJECTS(con);
            trunc_db.trunc_PARAMS(con);
         importXLS xls = new importXLS();
         workWithDB db = new workWithDB();
            InputStream in = new FileInputStream(f.getAbsolutePath());
         ArrayList<String> list_Name = xls.impXLS_ListName(in);
            db.addObj_type(list_Name, con);
             con.close();
        in = new FileInputStream(f.getAbsolutePath());
          atr = xls.impXLS_Attr_Name(in);
            in = new FileInputStream(f.getAbsolutePath());
        con = con_out.conect();
            db.addAtr(atr, con);
            con.close();
            
            in = new FileInputStream(f.getAbsolutePath());
          String sheet;
          Iterator<String>  sheet_it =   list_Name.iterator();
            while (sheet_it.hasNext()){
                sheet = sheet_it.next();
                con = con_out.conect();
                in = new FileInputStream(f.getAbsolutePath());
                db.addObj(xls.impXLS_ObjName(in, sheet), sheet, con );
                con.close();
                in = new FileInputStream(f.getAbsolutePath());
                xls.impXLS_ObjParams(in, sheet);

            }

        /**
         * Элемен работы с ATTR_OBJECT_TYPES
         * берет имя листа и атрибута проверяет на соответствие посредствам aceptColumnIndIndex
         * и если такой атрибут присутствует заносит в базу связку
         */
        sheet_it =   list_Name.iterator();
        while (sheet_it.hasNext()){
          // System.out.println("acept :::::");
           sheet = sheet_it.next();
           con = con_out.conect();
            in = new FileInputStream(f.getAbsolutePath());
            Iterator<String>  atr_it = atr.iterator();
             while (atr_it.hasNext()){
                 in = new FileInputStream(f.getAbsolutePath());
            db.addAtr_Obj_type(sheet, atr_it.next(), con, in);
             }
            con.close();

        }
        System.out.println("Complite.");
        }


        }


/**
 * класс чистки таблиц или их создания
 */
    class  trunc_DB{

    /**
     *
     * @param con
     * @return
     * @throws SQLException
     */
      public  boolean trunc_ATTRIBUTES(Connection con)
              throws  SQLException{


            java.sql.Statement stmt = con.createStatement();
            try {
                stmt.executeQuery("truncate table ATTRIBUTES drop storage");
            } catch (SQLException ex) {
                if (ex.getErrorCode()==942)   {
                    stmt.executeQuery("create table ATTRIBUTES " +
                            "( ATTR_ID int, NAME varchar(250))");
                }


        }
            return  true;
        }

    /**
     *
     * @param con
     * @return
     * @throws SQLException
     */

      public  boolean trunc_ATTR_OBJECT_TYPES(Connection con)
              throws  SQLException{

            java.sql.Statement stmt = con.createStatement();
            try {
                stmt.executeQuery("truncate table ATTR_OBJECT_TYPES drop storage");
            } catch (SQLException ex) {
                if (ex.getErrorCode()==942)   {
                    stmt.executeQuery(
                            "create table ATTR_OBJECT_TYPES ( ATTR_ID int, " +
                                    "OBJECT_TYPE_ID int, SHOW_ORDER int)");

                }



        }
            return  true;
        }

    /**
     *
     * @param con
     * @return
     * @throws SQLException
     */

      public  boolean trunc_OBJECTS(Connection con)
              throws  SQLException{

            java.sql.Statement stmt = con.createStatement();
            try
            {
                stmt.executeQuery("truncate table OBJECTS drop storage");
            }
            catch (SQLException e)
            {
                if( e.getErrorCode() == 942 )
                {
                    stmt.executeQuery(
                            "create table OBJECTS ( OBJECT_ID int, OBJECT_TYPE_ID int )");
                }
            }
            return  true;
        }

    /**
     *
     * @param con
     * @return
     * @throws SQLException
     */

      public  boolean trunc_OBJECT_TYPES(Connection con)
              throws  SQLException{

            java.sql.Statement stmt = con.createStatement();
            try {
                stmt.executeQuery("truncate table OBJECT_TYPES drop storage");

            }  catch(SQLException ex) {
                if (ex.getErrorCode()==942) {

                    stmt.executeQuery("create table OBJECT_TYPES"
                            + " ( OBJECT_ID int, OBJECT_TYPE_ID int, NAME varchar(250) )");

                }


            }
            return  true;
        }

    /**
     *
     * @param con
     * @return
     * @throws SQLException
     */
      public  boolean trunc_PARAMS(Connection con)
              throws  SQLException{

            java.sql.Statement stmt = con.createStatement();
            try {
                stmt.executeQuery("truncate table PARAMS drop storage");

            }  catch(SQLException ex) {   ex.printStackTrace();
                if (ex.getErrorCode()==942) {

                    stmt.executeQuery("create table PARAMS " +
                            "( OBJECT_ID int, ATTR_ID int, VALUE varchar(250) )");

                }
            }

         return  true;
        }
    }

